#ifndef _PERIPHERAL_H_
#define _PERIPHERAL_H_

#include <stdint.h>
#include <stdbool.h>

#define PWM_PERIOD_LED					19200

#define CHARGE_STATE_PORT		GPIOA
#define CHARGE_STATE_PIN		GPIO_PIN_9

#define UART_GPIO_CLK_ENABLE()	__HAL_RCC_GPIOF_CLK_ENABLE()
#define UART_GPIO_PORT			GPIOF
#define UART_TX_GPIO_PIN		GPIO_PIN_0
#define UART_RX_GPIO_PIN		GPIO_PIN_1

#define UART_TX_BUFFER_SIZE 512
#define UART_RX_BUFFER_SIZE 128

#define PRESS_SENSOR_LDO_GPIO_CLK_ENABLE()		__HAL_RCC_GPIOF_CLK_ENABLE()
#define PRESS_SENSOR_LDO_GPIO_PORT						GPIOF
#define PRESS_SENSOR_LDO_GPIO_PIN							GPIO_PIN_6

#define PRESS_SENSOR_INT_GPIO_CLK_ENABLE()		__HAL_RCC_GPIOF_CLK_ENABLE()
#define PRESS_SENSOR_INT_GPIO_PORT						GPIOF
#define PRESS_SENSOR_INT_GPIO_PIN							GPIO_PIN_5

#define VIN_DET_GPIO_CLK_ENABLE()							__HAL_RCC_GPIOA_CLK_ENABLE()
#define VIN_DET_GPIO_PORT											GPIOA
#define VIN_DET_GPIO_PIN											GPIO_PIN_0
 
#define CHARGE_STATE_GPIO_CLK_ENABLE()						__HAL_RCC_GPIOA_CLK_ENABLE()
#define CHARGE_STATE_GPIO_PORT										GPIOA
#define CHARGE_STATE_GPIO_PIN											GPIO_PIN_9

#define SHAKE_RSTN_GPIO_CLK_ENABLE()						__HAL_RCC_GPIOB_CLK_ENABLE()
#define SHAKE_RSTN_GPIO_PORT										GPIOB
#define SHAKE_RSTN_GPIO_PIN											GPIO_PIN_5

#define LED1W_GPIO_CLK_ENALBE()     __HAL_RCC_GPIOF_CLK_ENABLE()
#define LED1W_GPIO_PORT        			GPIOF
#define LED1W_GPIO_PIN         			GPIO_PIN_2

#define LED2R_GPIO_CLK_ENALBE()     __HAL_RCC_GPIOB_CLK_ENABLE()
#define LED2R_GPIO_PORT			        GPIOB
#define LED2R_GPIO_PIN        			GPIO_PIN_4

#define IIC_GPIO_CLK_ENALBE()			__HAL_RCC_GPIOB_CLK_ENABLE()
#define IIC_SCL_GPIO_PORT					GPIOB
#define IIC_SCL_GPIO_PIN					GPIO_PIN_6
#define IIC_SDA_GPIO_PORT					GPIOB
#define IIC_SDA_GPIO_PIN					GPIO_PIN_7

bool uart_flush();

void uart_init();

int fput_string(const char *p, int16_t len);

bool uart_finished();

void APP_ExtiConfig(void);

void pwm_led_init();

void set_LED1W_duty(int16_t duty);

void set_LED2R_duty(int16_t duty);

void press_sensor_calib(uint8_t s);

uint8_t read_press_sensor();

void shake_reset(uint8_t b);

uint8_t read_chage_state();

uint8_t read_vin_det();

int16_t read_battery_voltage();

void prepare_low_power_mode();

void resume_from_low_power_mode();

void enable_charge_duty();

void disable_charge_duty();

#endif
